#include "stm32f10x.h" // Device header
#include <stdio.h>
#include <stdarg.h>
#include "string.h"

char RxPacket[30]; // 定义接收数据包数组，数据包格式"@MSG\r\n"
char RxWiFiName[30];
char RxWiFiIP[30];
char RxCode[10];
char RxTemperature[30];

uint8_t RxFlag = 0; // 定义接收数据包标志位
uint8_t internet_flag = 0;

void USART1_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // TX
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // RX
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    USART_InitTypeDef USART_InitStruct;

    USART_InitStruct.USART_BaudRate = 115200;
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_InitStruct.USART_Parity = USART_Parity_No;
    USART_InitStruct.USART_StopBits = USART_StopBits_1;
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);

    USART_Init(USART1, &USART_InitStruct);
    USART_Cmd(USART1, ENABLE);
}

void USART1_SendByte(uint8_t Byte)
{
    USART_SendData(USART1, Byte);
    while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
        ;
}

void USART1_SendArray(uint8_t *pData, uint16_t length)
{
    uint16_t i;
    for (i = 0; i < length; i++)
    {
        USART1_SendByte(pData[i]);
    }
}

void USART1_SendString(char *String)
{
    uint8_t i;
    for (i = 0; String[i] != 0; i++)
    {
        USART1_SendByte(String[i]);
    }
}

uint32_t pow(uint32_t x, uint32_t y)
{
    uint32_t result = 1;
    while (y--)
    {
        result *= x;
    }
    return result;
}

void USART1_SendNumber(uint32_t Number, uint16_t length)
{
    uint16_t i;
    for (i = 0; i < length; i++)
    {
        USART1_SendByte(Number / pow(10, length - i - 1) % 10 + '0');
    }
}

void USART1_Printf(char *format, ...)
{
    char String[100];
    va_list arg;
    va_start(arg, format);
    vsprintf(String, format, arg);
    va_end(arg);
    USART1_SendString(String);
}

// uint8_t GetRxFlag(void)
// {
//     if (RxFlag == 1)
//     {
//         RxFlag = 0;
//         return 1;
//     }
//     return 0;
// }

// uint8_t GetRxData(void)
// {
//     return RxData;
// }



void USART1_IRQHandler(void)
{
    static uint8_t RxState = 0;   // 定义表示当前状态机状态的静态变量
    static uint8_t pRxPacket = 0; // 定义表示当前接收数据位置的静态变量
    if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
    {
        uint8_t RxData = USART_ReceiveData(USART1);
        if (RxState == 0)
        {
            if (RxData == '@' && RxFlag == 0) // 如果数据确实是包头，并且上一个数据包已处理完毕
            {
                RxState = 1;   // 置下一个状态
                pRxPacket = 0; // 数据包的位置归零
            }
        }
        /*当前状态为1，接收数据包数据，同时判断是否接收到了第一个包尾*/
        else if (RxState == 1)
        {
            if (RxData == '\r') // 如果收到第一个包尾
            {
                RxState = 2; // 置下一个状态
            }
            else // 接收到了正常的数据
            {
                RxPacket[pRxPacket] = RxData; // 将数据存入数据包数组的指定位置
                pRxPacket++;                  // 数据包的位置自增
            }
        }
        /*当前状态为2，接收数据包第二个包尾*/
        else if (RxState == 2)
        {
            if (RxData == '\n') // 如果收到第二个包尾
            {
                RxState = 0;                // 状态归0
                RxPacket[pRxPacket] = '\0'; // 将收到的字符数据包添加一个字符串结束标志
                RxFlag = 1;                 // 接收数据包标志位置1，成功接收一个数据包
            }
        }
        USART_ClearITPendingBit(USART1, USART_IT_RXNE); // 清除标志位
    }
    // RxData = USART_ReceiveData(USART1);
    // RxFlag = 1;
    // USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}

